package com.ruge._08_springboot_springdata_jpa.controller._02_entityManager;

import com.ruge._08_springboot_springdata_jpa.Application;
import com.ruge._08_springboot_springdata_jpa.model.base.BaseModel;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.EntityManager;

/**
 * 创建人 ：爱丽丝、如歌
 * 创建时间 ：2019-07-07  0:19
 * 描述 ：延迟加载
 * 操作                                               执行的SQL
 * em.remove(em.getReference(Person.class,1))          delete from Person where personid = 1
 * em.remove(em.find(Person.class,1))                  select * from Person where personid =1
 * delete from Person where personid =1
 */
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)//这里是启动类
public class TestLazy {
    @Autowired
    private EntityManager entityManager;

    @Test
    @Transactional
    public void test() {
        /**
         * 已经经过泛型处理。find方法相当于Hibernate里面的get方法。如果没有找到相应数据，就返回null.
         *
         * Person person=em.find(Person.class, 1);
         *
         * em.close();
         * System.out.println(person.getName());
         *
         * 而这段可以正确执行，因为person在find的时候就已经获取了相应的属性
         */
        BaseModel model = entityManager.find(BaseModel.class, 13);
        if (null != model) {
            System.out.println("entityManager.find" + model.getUserName());
        } else {
            System.out.println("entityManager.find is null");
        }
        /**
         * 如果这条记录不存在，单单这句话执行不会出错（返回代理）。但当使用person.getName()时会报实体不存在
         * 的异常。   相当于Hibernate里面的load方法。而且这种方法是延迟加载的。
         * 只有当实际访问实体属性时才到数据库中去执行查询。
         *
         * Person person=em.getReference(Person.class,1);
         *     em.close();
         *     System.out.println(person.getName());
         *
         * 此句话会报错，因为person的属性其实没有加载出来。
         */
        BaseModel model2 = entityManager.getReference(BaseModel.class, 13);

        System.out.println("entityManager.getReference" + model2.getUserName());
    }
}
